运维Python自动化之路:基础信息模块之psutil模块
文末赠书
系统信息的收集,对于服务质量的把控、服务的监控等来说是非常重要的组成部分,甚至是核心的基础支持部分。
我们可以通过大量的核心指标数据,结合对应的检测体系,快速的发现异常现象苗头,进行可控的措施。
psutil是一个跨平台库,主要获取两部分信息:
进程信息和系统利用率(包括cpu、内存、磁盘、网络等)信息。主要应用于系统监控,分享和限制系统资源及进程的管理。
进程相关:
ps 、top、lsof、kill、nice、pidof、taskset
网络相关:
netstat、ifconfig
用户相关:
who
磁盘相关:
df
内存相关:
free
io相关:
ionice、iostat、iotop
运行时相关:
uptime
终端相关:
tty
命令操作 | grep 过滤关键字 | awk 筛选具体数据值 | 其他的数据处理
ip address方式:
ip address 方式:
在python解释器环境中
# 1.导包
import psutil
#2.使用包功能
psutil.virtual_memory()
安装:
yum install ipython* -y
pip3 install ipython
通过psutil获取cpu相关信息
User Time:执行用户进程的时间百分比
System Time:执行内核进程和中断的时间百分比
Wait IO :由于IO等待而使CPU处于idle(空闲)状态的时间百分比
Idel :cpu处于idel状态的时间百分比
基本信息
cpu_times()
注意:
我们可以为该方法添加percup=True获取逻辑cpu信息
cpu核信息
cpu_count()
注意:
我们可以为该方法添加logical=True获取逻辑cpu信息
简单实践:
1.获取cpu的总体信息:
cpu_info = psutil.cpu_times()
print("cpu基本信息:{}".format(cpu_info))
print("cpu基本信息格式:{}".format(type(cpu_info)))
cpu_info= psutil.cpu_times()
cpu_user = cpu_info.user
print("cpu的用户进程占比:{}".format(cpu_user))
cpu_system=cpu_info.system
print("cpu的系统进程占比:{}".format(cpu_system))
cpu_iowait=cpu_info.iowait
print("cpu的io等待占比:{}".format(cpu_iowait))
cpu_count = psutil.cpu_count()
print("cpu的核信息:{}".format(cpu_count))
cpu_count = psutil.cpu_count(logical=True)
print("cpu的核信息(包含逻辑):{}".format(cpu_count))
print(psutil.users())
通过psutil获取内存相关信息数据
Linux系统的内存利用率信息涉及total(内存总数)、used(已使用的内存数)、free(空闲内存数)、buffers(缓冲使用数)、cache(缓存使用数)、swap(交换分区使用数)等
获取内存基本信息
psutil.virtual_memory()
获取交换内存基本信息
psutil.swap_memory()
mem_info = psutil.virtual_memory()
print("内存的基本信息:{}".format(mem_info))
mem_total = mem_info.total
print("内存的总量:{}".format(mem_total))
mem_used = mem_info.used
print("内存的总量:{}".format(mem_used))
mem_free = mem_info.free
print("内存的总量:{}".format(mem_free))
mem_buffers = mem_info.buffers
print("内存的总量:{}".format(mem_buffers))
mem_swap = psutil.swap_memory()
print("内存的交换信息:{}".format(mem_swap))
swap_total = mem_swap.total
print("交换内存总量:{}".format(swap_total))
在系统的所有磁盘信息中,我们更加关注磁盘的利用率及IO信息,其中磁盘利用率使用psutil.disk_usage方法获取。
基本使用:
磁盘的分区信息获取:
disk_partitions
磁盘的挂载点信息获取
disk_usage('挂载点')
磁盘io相关操作信息
disk_io_counters()
可以通过perdisk = True 获取具体的分区详情
1.获取磁盘分区的详情信息
disk_info = psutil.disk_partitions()
print("所有的分区详情:{}".format(disk_info))
2.获取磁盘分区的挂载点基本信息
disk_root = psutil.disk_usage('/')
print("根分区详情:{}".format(disk_root))
3.获取磁盘分区的部分信息
root_total = disk_root.total
print("根分区挂载容量详情:{}".format(root_total))
4.获取io基本信息
disk_count = psutil.disk_io_counters()
print("分区io信息:{}".format(disk_count))
disk_writer_count = disk_count.write_count
print("分区io写数量信息:{}".format(disk_writer_count))
disk_per = psutil.disk_io_counters(perdisk=True)
print("每个分区的io信息:{}".format(disk_per))
系统的网络信息与IO类似,涉及几个关键点,包括bytes_sent(发送字节数)、bytes_rev=28220199(接收字节数)、packets_sent=200978(发送数据包数)、packets_recv=212672(介绍数据包数)等。
获取网络的数据传输信息
net_io_counters()
1.获取网络的详情信息
network_info = psutil.net_io_counters()
print("网卡的数据传输信息:{}".format(network_info))
network_recv = network_info.bytes_recv
print("网卡的接收数据信息: {}".format(network_recv))
network_sent = network_info.bytes_sent
print("网卡的发送数据信息:{}".format(network_sent))
network_packet_sent = network_info.packets_sent
print("网卡的发送数据包信息:{}".format(network_packet_sent))
network_addrs = psutil.net_if_addrs()
print("网卡的地址信息:{}".format(network_addrs))
network_stats = psutil.net_if_stats()
print("网卡的状态信息:{}".format(network_stats))
network_conn = psutil.net_connections()
print("网卡的连接信息:{}".format(network_conn))
获取连接的用户信息
users()
获取启动时间
boot_time()
user_info = psutil.users()
print("连接的用户信息:{}".format(user_info))
import datetime
date_time = psutil.boot_time()
print("系统启动的时间信息:{}".format(date_time))
#转换时间格式(时间戳定位)
date_time_format = datetime.datetime.fromtimestamp(date_time).strftime("%Y-%m-%d %H:%M:%S")
print("转化格式后的时间信息:{}".format(date_time_format))
这类用的格式等同于命令:
date +%Y-%m-%d%H:%M:%S
获取进程相关的信息
pids()
获取指定进程的相关信息
process()
获取进程信息的常见方法
name()/exe()/cwd(),status(),create_time(),
uids(),gids(),cpu_times(),cpu_affinity(),
memory_percent(),memory_info(),io_counters(),
connections*()
1.获取进程所有相关信息
process_id_list = psutil.pids()
print("当前所有系统运行的进程号:{}".format(process_id_list))
2.判断指定进程id是否存在
pid_num = 658
result = psutil.pid_exists(pid_num)
print("{} 进程是否是运行状态:{}".format(pid_num,result))
pid_info = psutil.Process(pid_num)
print("{} 进程是否是运行状态:{}".format(pid_num,pid_info))
pid_info = psutil.Process(pid_num)
print("{} 进程是否是运行状态:{}".format(pid_num,pid_info.name))
注意:
进程的属性信息,需要借助于专用的方法来进行获取,通用的属性不管用
pid_info = psutil.Process(pid_num)
print("{} 进程的名称是:{}".format(pid_num,pid_info.name()))
pid_info = psutil.Process(pid_num)
print("{} 进程的执行命令路径:{}".format(pid_num,pid_info.exe()))
pid_info = psutil.Process(pid_num)
print("{} 进程的工作目录:{}".format(pid_num,pid_info.cwd()))
pid_info = psutil.Process(pid_num)
print("{} 进程的状态是:{}".format(pid_num,pid_info.status()))
基本语法:
psutil.Popen('执行命令','参数','内容'],stdout=信息接收器)
属性解析:
exec模式:['执行命令','参数','内容']
shell模式:执行命令 参数 内容
#导包
import psutil
from subprocess import PIPE
#指定用户执行程序
#1.1创建用户程序
my_process = psutil.Popen(['/usr/bin/python3','-c','print("hello world")'], stdout = PIPE)
#1.2 用户程序的信息获取
print("用户进程的名称:{}".format(my_process.name()))
print("用户进程的启动用户:{}".format(my_process.username()))
print("用户进程的输出信息:{}".format(my_process.communicate()))
本书尽可能地以相对轻松的笔调来讲述略显枯燥的网络协议知识。本书也尽可能地深挖网络概念背后的细节和本质,期望做到生动有趣、深入浅出,能给读者枯燥的学习增加一点轻松快乐。
同样这次准备了另外种方式抽奖,「群红包最佳、朋友圈点赞」这两种方式都可以参与!感谢亲爱的读者们,你们的支持也是我持续更文最大的动力。
本次开奖时间为 2021.6.30 20:00
为了避免中奖后失联,提前加我微信号:ShiRan_ZT 。
朋友圈点赞抽奖(2本)
《深入浅出TCP/IP和VPN》和《数据分析从Excel到Power BI:Power BI商业数据分析思维、技术与实践》
,共2位。开启副业掘金之路,尽在聚能小课